const resultEl = document.getElementById('result')
const lengthEl = document.getElementById('length')
const uppercaseEl = document.getElementById('uppercase')
const lowercaseEl = document.getElementById('lowercase')
const numbersEl = document.getElementById('numbers')
const symbolsEl = document.getElementById('symbols')
const generateEl = document.getElementById('generate')
const clipboardEl = document.getElementById('clipboard')

const randomFunc = {
    lower: getRandomLower,
    upper: getRandomUpper,
    number: getRandomNumber,
    symbol: getRandomSymbol
}

clipboardEl.addEventListener('click',copyPageUrl)
async function copyPageUrl() {
    const password = resultEl.innerText
    if(!password) { return }
    try {   
        await navigator.clipboard.writeText(password);
        alert('密码复制成功!')
    } catch (err) {
        alert("密码复制失败!");
    }
}


generateEl.addEventListener('click', () => {
    const length = +lengthEl.value
    const hasLower = lowercaseEl.checked
    const hasUpper = uppercaseEl.checked
    const hasNumber = numbersEl.checked
    const hasSymbol = symbolsEl.checked

    resultEl.innerText = generatePassword(hasLower, hasUpper, hasNumber, hasSymbol, length)
})
//生成随机密码 
// 将是否选择大写英文字母，小写英文字母，数字，特殊符号的状态和密码位数作为参数
function generatePassword(lower, upper, number, symbol, length) {
    console.log(lower, upper, number, symbol, length)
    let generatedPassword = ''
    const typesCount = lower + upper + number + symbol
   //Object.values(item)[0] 获取数组中每个对象的值  
   // 筛选出值为true(状态为选中的)的大写英文字母、小写英文字母、数字、特殊符号
    const typesArr = [{lower}, {upper}, {number}, {symbol}].filter(item => Object.values(item)[0] )
    // 状态都为未选中，则都为flase，加起来就是0；直接返回
    if(typesCount === 0) {
        return false
    }

    for(let i = 0; i < length; i +=  typesCount) {
        // 遍历循环状态为选中的对象组成的数组，获取每个对象的属性名，根据属性名调用各自生成函数
        typesArr.forEach(type => {
            const funcName = Object.keys(type)[0]
            generatedPassword += randomFunc[funcName]()
        })
    }
    // 截取选择的密码位数长度的随机密码
    const finalPassword = generatedPassword.slice(0, length)
    return finalPassword
}
// 生成小写字母
function getRandomLower() {
    return String.fromCharCode(Math.floor(Math.random() * 26) + 97)
}
// 生成大写字母
function getRandomUpper() {
    return String.fromCharCode(Math.floor(Math.random() * 26) + 65)
}
// 生成数字
function getRandomNumber() {
    return String.fromCharCode(Math.floor(Math.random() * 10) + 48)
}
// 生成特殊字符
function getRandomSymbol() {
    const symbols = '!@#$%^&*(){}[]=<>/,.'
    return symbols[Math.floor(Math.random() * symbols.length)]
}